AWS Elastic Beanstalk に express で作ったアプリケーションをデプロイしてみた
AWS Elastic Beanstalk for Node.js が出たので、express で作ったアプリケーションをデプロイしてみました。
事前準備
- AWS Elastic Beanstalk Command Line Tool をダウンロードしてパスを通します。
http://aws.amazon.com/code/6752709412171743 - Git をインストールします。
1.6.6 以降が必要です。 - node.js と express をインストールします。
http://nodejs.org/※
http://expressjs.com/
※ 先日、stable v0.10.0 が出ましたが、Beanstalk の Node.js のバージョンは、0.8.18 なので 0.8系で行いました。
express アプリケーションの作成
先ずは、express を使ってサンプルのアプリケーションを作成します。
$ express beanstalk-sample create : beanstalk-sample create : beanstalk-sample/package.json create : beanstalk-sample/app.js create : beanstalk-sample/public create : beanstalk-sample/public/javascripts create : beanstalk-sample/public/images create : beanstalk-sample/public/stylesheets create : beanstalk-sample/public/stylesheets/style.css create : beanstalk-sample/routes create : beanstalk-sample/routes/index.js create : beanstalk-sample/routes/user.js create : beanstalk-sample/views create : beanstalk-sample/views/layout.jade create : beanstalk-sample/views/index.jade install dependencies: $ cd beanstalk-sample && npm install run the app: $ node app
依存モジュールをインストールします。
$ cd beanstalk-sample $ npm install
ローカルで確認するために、npm start。
$ npm start npm WARN package.json application-name@0.0.1 No README.md file found! > application-name@0.0.1 start /Users/yamatoyo/Documents/example/beanstalk-sample > node app Express server listening on port 3000
起動されることを確認します。
Elastic Beanstalk の環境をつくる
最初に git リポジトリを作成します。
$ git init Initialized empty Git repository in /Users/xxx/Documents/beanstalk-sample/.git/
リポジトリに追加しないファイルを .gitignore に追加します。
$ cat > .gitignore <<EOT node_modules/ .gitignore .elasticbeanstalk/ EOT [/code] <p>eb init で環境を作成します。インタラクティブに行えます。<br/> 最初に、Access Key と Secret Access Key の入力が求められます。</p> $ eb init To get your AWS Access Key ID and Secret Access Key, visit "https://aws-portal.amazon.com/gp/aws/securityCredentials". Enter your AWS Access Key ID (current value is "xxxxx*****xxxxx"): Enter your AWS Secret Access Key (current value is "xxxxx*****xxxxx"):
リージョンは、Tokyoリージョンを選択しました。
Select an AWS Elastic Beanstalk service region. Available service regions are: 1) US East (Virginia) 2) US West (Oregon) 3) US West (North California) 4) EU West (Ireland) 5) Asia Pacific (Singapore) 6) Asia Pacific (Tokyo) 7) Asia Pacific (Sydney) 8) South America (Sao Paulo) Select: (1 to 8): 6
アプリケーション名と環境名は auto-generated のものを使用しました。
Enter an AWS Elastic Beanstalk application name (auto-generated value is "beanstalk-example"): Enter an AWS Elastic Beanstalk environment name (auto-generated value is "beanstalk-example-env"):
solution stack は、64bit の Amazon Linux を選択しました。
Select a solution stack. Available solution stacks are: 1) 32bit Amazon Linux running PHP 5.4 2) 64bit Amazon Linux running PHP 5.4 3) 32bit Amazon Linux running PHP 5.3 4) 64bit Amazon Linux running PHP 5.3 5) 32bit Amazon Linux running Node.js 6) 64bit Amazon Linux running Node.js 7) 64bit Windows Server 2008 R2 running IIS 7.5 8) 64bit Windows Server 2012 running IIS 8 9) 32bit Amazon Linux running Tomcat 7 10) 64bit Amazon Linux running Tomcat 7 11) 32bit Amazon Linux running Tomcat 6 12) 64bit Amazon Linux running Tomcat 6 13) 32bit Amazon Linux running Python 14) 64bit Amazon Linux running Python 15) 32bit Amazon Linux running Ruby 1.8.7 16) 64bit Amazon Linux running Ruby 1.8.7 17) 32bit Amazon Linux running Ruby 1.9.3 18) 64bit Amazon Linux running Ruby 1.9.3 Select: (1 to 18): 6
RDS は no を選択しました。
Create an RDS DB Instance? [y/n]: n
アプリケーションの開始
eb start コマンドで、Beanstalk上のアプリケーションを開始できます。
$ eb start Starting application "beanstalk-sample". Waiting for environment "beanstalk-sample-env" to launch. 2013-03-13 16:01:51INFOcreateEnvironment is starting. 2013-03-13 16:01:56INFOUsing elasticbeanstalk-ap-northeast-1-077645620084 as Amazon S3 storage bucket for environment data. 2013-03-13 16:02:40INFOCreated load balancer named: awseb-e-s-AWSEBLoa-9PIDIBHZ8XPY 2013-03-13 16:02:51INFOCreated security group named: awseb-e-s3pmwsxbq8-stack-AWSEBSecurityGroup-ZA85A2XQSSLF 2013-03-13 16:02:55INFOCreated Auto Scaling launch configuration named: awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingLaunchConfiguration-2CQ8MVC9DM3P 2013-03-13 16:03:56INFOWaiting for EC2 instances to launch. This may take a few minutes. 2013-03-13 16:03:56INFOCreated Auto Scaling group named: awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingGroup-17SFWQNFJCO79 2013-03-13 16:04:52INFOCreated Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:077645620084:scalingPolicy:64c6ecab-df01-439a-bda8-fd098958e4d4:autoScalingGroupName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingGroup-17SFWQNFJCO79:policyName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingScaleDownPolicy-FI44ZUPH7B5E 2013-03-13 16:04:55INFOCreated CloudWatch alarm named: awseb-e-s3pmwsxbq8-stack-AWSEBCloudwatchAlarmLow-11UQ8TKKEBO91 2013-03-13 16:04:58INFOCreated Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:077645620084:scalingPolicy:764d3171-e239-463b-a7b9-21aed802e105:autoScalingGroupName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingGroup-17SFWQNFJCO79:policyName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingScaleUpPolicy-IY9CLIN1XF12 2013-03-13 16:05:00INFOCreated CloudWatch alarm named: awseb-e-s3pmwsxbq8-stack-AWSEBCloudwatchAlarmHigh-6Q8V01UFMV8T
ELBやAuto Scaling Group、CloudWatch alarm などが自動で生成されました。
処理が終わったら、eb statusコマンドで、作成された情報を確認します。
$ eb status --verbose Retrieving status of environment "beanstalk-sample-env". URL: beanstalk-sample-env-xxxxxx.elasticbeanstalk.com Status: Ready Health: Green Environment Name:beanstalk-sample-env Environment ID:e-s3pmwsxbq8 Solution Stack:64bit Amazon Linux running Node.js Version Label:Sample Application Date Created:2013-03-13 16:01:52 Date Updated:2013-03-13 16:08:08 Description:None
ブラウザで上記のURL http:// beanstalk-sample-env-xxxxxx.elasticbeanstalk.com を開くと、Congratulations の画面が開きます。
Beanstalk にデプロイする
Beanstalk にデプロイするには、aws.push コマンドを使用します。
$ git add . $ git commit -m 'Initial commit.' [master (root-commit) 7f5e89a] Initial commit. 7 files changed, 83 insertions(+) create mode 100644 app.js create mode 100644 package.json create mode 100644 public/stylesheets/style.css create mode 100644 routes/index.js create mode 100644 routes/user.js create mode 100644 views/index.jade create mode 100644 views/layout.jade $ git aws.push Counting objects: 13, done. Delta compression using up to 4 threads. Compressing objects: 100% (11/11), done. Writing objects: 100% (13/13), 1.57 KiB, done. Total 13 (delta 0), reused 0 (delta 0) remote: To https://xxxx…. * [new branch] HEAD -> master
push 後すぐは、Status が Updating になっています。
$ eb status --verbose Retrieving status of environment "beanstalk-sample-env". URL: beanstalk-sample-env-xxxxxx.elasticbeanstalk.com Status: Updating Health: Grey Environment Name:beanstalk-sample-env Environment ID:x-xxxxxxxxx Solution Stack:64bit Amazon Linux running Node.js Version Label:git-xxxxxx Date Created:2013-03-13 16:01:52 Date Updated:2013-03-13 16:11:27 Description:None
少しまって、再度確認すると、Status が Ready になりました。
$ eb status --verbose Retrieving status of environment "beanstalk-sample-env". URL: beanstalk-sample-env-xxxxxx.elasticbeanstalk.com Status: Ready Health: Green Environment Name:beanstalk-sample-env Environment ID:x-xxxxxxxxx Solution Stack:64bit Amazon Linux running Node.js Version Label:git-xxxxxx Date Created:2013-03-13 16:01:52 Date Updated:2013-03-13 16:13:35 Description:None
ブラウザで http:// beanstalk-sample-env-xxxxxx.elasticbeanstalk.com を開くと、きちんとデプロイされています。
コンソールを確認してみる
Management Console では、イベントログや、
バージョンなどが確認できます。
アプリケーションの削除
確認が終わったので、環境とアプリケーションを削除します。
$ eb stop Terminate environment? [y/n]: y Stopping environment "beanstalk-sample-env". This may take a few minutes. 2013-03-14 01:14:24 INFO terminateEnvironment is starting. 2013-03-14 01:14:39 INFO Deleted CloudWatch alarm named: awseb-e-s3pmwsxbq8-stack-AWSEBCloudwatchAlarmHigh-6Q8V01UFMV8T 2013-03-14 01:14:42 INFO Deleted Auto Scaling group policy named:・・・・ ・・・・・ Stop of environment "beanstalk-sample-env" has completed. $ eb delete Delete application? [y/n]: y Deleted application "beanstalk-sample".
まとめ
今回 Beanstalk を初めて触ってみましたが、コマンドラインで簡単に操作出来る点、特にgit形式でデプロイを簡単に行える部分が気に入りました。
他にもAmazon RDSやElasticacheとの連携も容易に行うことができるようなので、機会があれば次回試してみます。